// Rétroaction sur un message : 👍/👎, signalement, sauvegarde en bibliothèque. import { NextResponse } from "next/server"; import { z } from "zod"; import { apiError, parseBody } from "@/lib/api.ts"; import { assertSameOrigin, requireUser } from "@/lib/auth/session.ts"; import { get, run } from "@/lib/db/index.ts"; const schema = z.object({ feedback: z.union([z.literal(-1), z.literal(0), z.literal(1)]).optional(), flag: z.boolean().optional(), flagReason: z.string().max(500).optional(), save: z.boolean().optional(), }); export async function PATCH(req: Request, ctx: { params: Promise<{ id: string }> }) { try { await assertSameOrigin(); const user = await requireUser(); const id = parseInt((await ctx.params).id, 10); const msg = get<{ id: number; conversation_id: number; content: string; user_id: number; course_code: string | null }>( `SELECT m.id, m.conversation_id, m.content, c.user_id, c.course_code FROM messages m JOIN conversations c ON c.id = m.conversation_id WHERE m.id = ?`, id ); if (!msg || msg.user_id !== user.id) return NextResponse.json({ error: "Message introuvable." }, { status: 404 }); const body = await parseBody(req, schema); if (body.feedback !== undefined) run("UPDATE messages SET feedback = ? WHERE id = ?", body.feedback, id); if (body.flag) { run("UPDATE messages SET flagged = 1 WHERE id = ?", id); run("INSERT INTO report_flags (message_id, user_id, reason) VALUES (?, ?, ?)", id, user.id, body.flagReason ?? ""); } if (body.save) { run("UPDATE messages SET saved = 1 WHERE id = ?", id); run( "INSERT INTO saved_items (user_id, kind, course_code, title, content, meta) VALUES (?, 'answer', ?, ?, ?, ?)", user.id, msg.course_code, msg.content.replace(/\s+/g, " ").slice(0, 80), msg.content, JSON.stringify({ messageId: id }) ); } return NextResponse.json({ ok: true }); } catch (e) { return apiError(e); } }